import { Message } from 'element-ui'
// 判断非空
export function isNull(str) {
  return !!(!str && str !== 0 && typeof str !== 'boolean')
}

/**
 * @desc 判断是否是对象
 * @returns {String}
 */
export function typeObject(obj) {
  const type = Object.prototype.toString.call(obj)
  if (type === '[object Array]') {
    return 'Array'
  } else if (type === '[object Object]') {
    return 'Object'
  } else {
    return 'obj is not object or array'
  }
}
// 日期格式化
export function dateFtt(fmt, date) {
  date = new Date(date)
  // fmt 格式化时间格式 yyyy-MM-dd hh:mm:ss
  var o = {
    'M+': date.getMonth() + 1, // 月份
    'd+': date.getDate(), // 日
    'h+': date.getHours(), // 小时
    'm+': date.getMinutes(), // 分
    's+': date.getSeconds(), // 秒
    'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
    'S': date.getMilliseconds() // 毫秒
  }
  if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) }
  for (var k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) { fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) }
  }
  return fmt
}
export function removePropertyOfNull(obj) {
  Object.keys(obj).forEach(item => {
    if (obj[item] === '') delete obj[item]
    if (item.indexOf('$') !== -1) delete obj[item]
    if (typeof obj[item] == 'string') {
      obj[item] = obj[item].trim()
    }
  })
  return obj
}
/**
 * @desc 清除多余筛选字段
 * @returns {String}
 */
export function clearFilterFormFields(params = {}) {
  for (const key in params) {
    if (isNull(params[key]) || typeObject(params[key]) === 'Array' && (params[key].length === 0 || params[key].includes('') || params[key].includes('all'))) delete params[key]
  }
  return params
}

// 获取数组连续的值 返回二维数组
export function seriesIntArray(arr) {
  console.log(arr)
  const newArr = []; let i = 0
  newArr[i] = [arr[0]]
  arr.reduce(function(prev, cur) {
    cur - prev === 1 ? newArr[i].push(cur) : newArr[++i] = [cur]
    return cur
  })
  return newArr
}

export function isJSON(str) {
  if (typeof str === 'string') {
    try {
      if (typeof obj === 'object' && obj) {
        return true
      } else {
        return false
      }
    } catch (e) {
      return false
    }
  }
  return false
}

// 上传图片
export function beforeUploadImg(file, vue, imgWidth, imgHeight, imgSizes, imgType = ['JPG', 'PNG']) {
  vue.uploadHeaders = {
    'X-BUSINESS-TOKEN': vue.$store.state.user.token
  }
  const typeObj = {
    JPG: 'image/jpeg',
    PNG: 'image/png',
    GIF: 'image/gif'
  }
  const typeArr = []
  imgType.forEach(v => {
    if (typeObj[v]) typeArr.push(typeObj[v])
  })
  const isType = !!typeArr.includes(file.type)
  if (!isType) {
    vue.$message.error(`上传图片只能是 ${imgType.join('/')} 格式!`)
    return false
  }

  const rightSizes = file.size / 1024 / 1024 < imgSizes
  if (!rightSizes) {
    if (imgSizes >= 1) {
      vue.$message.error(`上传图片大小不能超过 ${imgSizes}MB!`)
    } else {
      vue.$message.error(`上传图片大小不能超过 ${imgSizes * 1000}KB!`)
    }
    return false
  }

  // 不限制宽高
  if (imgWidth === 0 && imgHeight === 0) {
    return true
  }

  // 限制宽高
  const isSize = new Promise(function(resolve, reject) {
    const width = imgWidth
    const height = imgHeight
    const _URL = window.URL || window.webkitURL
    const img = new Image()
    img.onload = function() {
      const valid = img.width <= width && img.height <= height
      valid ? resolve() : reject()
    }
    img.src = _URL.createObjectURL(file)
  }).then(
    () => {
      return file
    },
    () => {
      vue.$message.error(`上传图片像素大小不能超过 ${imgWidth}*${imgHeight}px!`)
      return Promise.reject()
    }
  )
  return isSize
}

// 上传excel
export function beforeUploadExcel(file, vue, sizes) {
  console.log(file)
  const isType = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  if (!isType) {
    vue.$alert('格式错误，请上传xlsx格式的Excel文件', '温馨提示', {
      confirmButtonText: '确定',
      center: true,
      type: 'warning',
      callback: action => { }
    })
    return false
  }
  const rightSizes = file.size / 1024 / 1024 < sizes
  if (!rightSizes) {
    if (sizes >= 1) {
      vue.$message.error(`上传文件大小不能超过 ${sizes}MB!`)
    } else {
      vue.$message.error(`上传文件大小不能超过 ${sizes * 1000}KB!`)
    }
    return false
  }
  return true
}

// 上传文件
export function uploadFileBefore({ file, maxSizes = 1, types = ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], typeErr = '上传文件格式错误!' }) {
  const isType = types.includes(file.type)
  if (!isType) {
    Message.error(typeErr)
    return false
  }
  const rightSizes = file.size / 1024 / 1024 < maxSizes
  if (!rightSizes) {
    Message.error(maxSizes >= 1 ? `上传文件大小不能超过 ${maxSizes}MB!` : `上传文件大小不能超过 ${maxSizes * 1000}KB!`)
  }
  return true
}

export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result

  const later = function() {
    // 据上一次触发时间间隔
    const last = +new Date() - timestamp

    // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
    } else {
      timeout = null
      // 如果设定为immediate===true，因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
      }
    }
  }

  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
    // 如果延时不存在，重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
    }

    return result
  }
}

// 数字补0
export function prefix0Integer(num, m) {
  return (Array(m).join(0) + num).slice(-m)
}

// 判断是否是数字 其实是jquery中$.isNumeric的源码，可识别字符串数字为true
export function isNumeric(value) {
  return !isNaN(parseFloat(value)) && isFinite(value)
}

export const Entrance_Type = {
  /**
   * 类型，0：功能入口，1：营销入口，2公域用户功能入口，3.公域商户功能入口
   */
  MERCHANT: 0,
  PUB_MERCHANT: 1,
  PUB_MERCHANT_APPLET: 3
}

export const SCOPE = {
  // 作用域：0公域用户小程序端;1公域商户小程序端;"
  USER_APPLET: 0,
  MERCHANT_APPLET: 1
}
